package com.capturadorrutas;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.List;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class CapturadorRutas extends MapActivity implements Runnable{
	
	private final static String API_KEY = "0TZByoF31TtokP6t2wljBU7im4SQfks37vVopvw";
	
	//	Variables para controlar el mapa
	
	MapView mapa;
	MapController mc;	
	
	//	Variable para la posicion
	
	GeoPoint posicion;
	
	//	Variable para el menu
	
	Menu menuPpal;
	
	//	Variables para la ubicacion
	
	LocationManager lManager;
	LocationListener lListener;
	Location localizacionActual;
	
	//	Variable para el dialogo de progreso
	
	ProgressDialog progreso;
	
	//	Variable para manejar los mensajes
	
	private Handler handler = new Handler(){
		
		public void handleMessage(android.os.Message msg) {
			progreso.dismiss();
			lManager.removeUpdates(lListener);
			
			if(localizacionActual != null){
				
			}
		};		
	};
	
	//	Variable para identificar la ruta 1 - 12
	
	int ruta = 1;
	int parada = 1;
	private static final int MAX_VALUE = 12;
	
	//	Cadena para la ubicacion
	
	String provider;
	
    //	Creamos las variables para los marcadores indicando la lista, el icono y los marcadores
    
    List<Overlay> mainMarcadores;
	Drawable icono;
	Marcadores misMarcadores;
    
	//	Variables para las coordenadas obtenidas
	
	double latitUser;
	double longiUser;
	
	//	Caja de texto para el nombre de la parada
	
	public EditText nombre;
	public String nombreParada;
	
	//	Variables para crear el archivo
	
	File rutas;
	FileOutputStream salida;
	OutputStreamWriter escritor;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
    	//	Relacionamos con los elementos que ya tenemos
    	
        mapa = (MapView) findViewById(R.id.mapview);
        mc = mapa.getController();
        
        lManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        
        menuPpal = (Menu) findViewById(R.menu.menu_principal);
        
        //	Creamos los marcadores ya existentes
        
        mainMarcadores = mapa.getOverlays();
        
        //	Definimos el icono de los marcadores
        
        icono = this.getResources().getDrawable(R.drawable.androidmarker);  
        
        misMarcadores = new Marcadores(icono,this);
        
	}
	
	//	Creamos el menu con el menu_principal.xml
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		MenuInflater inflater = getMenuInflater();
		
		inflater.inflate(R.menu.menu_principal, menu);
		
		return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		
		switch(item.getItemId()){
		case R.id.cambiar:
			//	Cambiamos el numero de la ruta siempre y cuando sea menor a 12
			if(ruta <= MAX_VALUE){		
				parada = 1;
				ruta += 1;	
				//Toast.makeText(this, "parada: " + parada + " ruta: " + ruta, Toast.LENGTH_SHORT).show();
			}
				
			break;
		case R.id.capturar:
			//	Obtenemos la posición de la parada.
			showDialog(1);
			getGPSSignal();
				
			break;
			
		case R.id.ver:
			
			break;
		}
		
		return false;
	}
	
	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
	
    	
	private void agregarMarcador(String nombre, int ruta, int parada){
		GeoPoint puntoUser = new GeoPoint((int) (latitUser * 1E6), 
										(int)(longiUser * 1E6));
		//mc.animateTo(puntoUser);
		//mc.setZoom(10);
		
        OverlayItem userItem = new OverlayItem(puntoUser,
        		"Ruta: " + ruta + " Parada: " + parada,
        		nombre	+latitUser+", "+longiUser);
        
        misMarcadores.addOverLay(userItem);
        
        mainMarcadores.add(misMarcadores);
        
        mapa.invalidate();

	}
	private void getGPSSignal(){
		//		Al presionar la tecla de retorno se cancela la busqueda. Mostramos dialogo
	    	
	    	DialogInterface.OnCancelListener dialogoCancelar = new DialogInterface.OnCancelListener() {
				
				@Override
				public void onCancel(DialogInterface dialog) {
					// TODO Auto-generated method stub
					Toast.makeText(CapturadorRutas.this, "Busqueda cancelada", 
							Toast.LENGTH_SHORT).show();
					
					handler.sendEmptyMessage(0);
				}
			};
			
			//	Asignamos el servicio al manejador.
			
			lManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
			
			//	Verificamos si el proveedor, GPS o Red esta habilitado
			
			if(!lManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
				
				Toast.makeText(this, "GPS inhabilidado", Toast.LENGTH_SHORT).show();
				
				return;
			}
			
			//	Dialogo que se muestra al buscar señal. Cancelable
			
			progreso = ProgressDialog.show(this, "Buscando señal GPS", 
						"Buscando...", true, true, dialogoCancelar);
			
			//	Hilo que maneja el progreso
			
			Thread hiloImportante = new Thread(CapturadorRutas.this);
			hiloImportante.start();	
		}

    @Override
    protected Dialog onCreateDialog(int id) {
    	// TODO Auto-generated method stub
    	switch (id) {
		case 1:
			LayoutInflater perla = LayoutInflater.from(this);
			final View datos = perla.inflate(R.layout.dialogo_datos, null);
			
			return new AlertDialog.Builder(this)
				.setTitle("Ingresa los datos de la parada")
				.setView(datos)
				.setPositiveButton("Aceptar", new OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {						
						try{
							//	Inicializamos la caja de texto utilizando la vista del dialogo
							
							nombre = (EditText) datos.findViewById(R.id.nombreEstacion);
							
							// Obtenemos la cadena del nombre de la parada
							
							nombreParada = nombre.getText().toString();
														
							Toast.makeText(CapturadorRutas.this,"Numero de parada: " + parada +
									" Ruta: " + ruta +
									nombreParada
									+" Lat: " + latitUser + 
									" Long: " + longiUser
									, Toast.LENGTH_LONG).show();
							
							agregarMarcador(nombreParada, ruta, parada);
							
							//crearArchivo();
							
							escribirArchivo(ruta + " " +  parada + " " + nombreParada + " " + 
									+ latitUser + " " + longiUser + "\n");
							parada += 1;
							
							//cerrarArchivo();
							
						}catch(Exception e){
							e.printStackTrace();
						}
					}
				}).create();

		default:
			break;
		}
    	return super.onCreateDialog(id);
    }
    
    /** Called when the activity is first created. */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		lListener = new LocationListener(){
			
		@Override
		public void onLocationChanged(Location location) {
			// 	Para cada que cambie la ubicación
			//	Cambia las etiquetas con la ubicación actual
			
			if(location != null){
				posicion = new GeoPoint((int) (location.getLatitude()* 1E6),							
						((int) (location.getLongitude()*1E6)));
				
				//	Asignamos los valores de latitud y longitud obtenidos
				//	a los atributos de la clase para manejarlos
				
				latitUser = location.getLatitude();
				longiUser = location.getLongitude();
				
				mc.animateTo(posicion);
				mc.setZoom(25);
				
				handler.sendEmptyMessage(0);
			}
		}

		@Override
		public void onProviderDisabled(String provider) {
			// Si el proveedor deja de dar servicio
			
		}

		@Override
		public void onProviderEnabled(String provider) {
			// Cuando el proveedor otorgue servicio
			
		}

		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// Si el estado cambia.
			
		}
		
		};
		
		Looper.prepare();
		
		lManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,
								0, lListener);
		
		Looper.loop();
		Looper.myLooper().quit();
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		mainMarcadores = mapa.getOverlays();		 
	}
	
	public void escribirArchivo(String cadena){
		try{
			
			rutas  = new File("/sdcard/rutas.txt");
			
			FileWriter escritor  = new FileWriter("/sdcard/rutas.txt", true);			
			
			escritor.append(cadena);
			escritor.write("\n");
			
			escritor.close();
			
		}catch(Exception e){
//			Toast.makeText(getBaseContext(), 
//					e.getMessage(), Toast.LENGTH_LONG).show();
			e.printStackTrace();
		}
	}
}